<?php

/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/4/17
 * Time: 17:58
 */

namespace common;

use VDB\Spider\Discoverer\XPathExpressionDiscoverer;
use Symfony\Component\EventDispatcher\Event;
use VDB\Spider\Event\SpiderEvents;
use VDB\Spider\StatsHandler;
use VDB\Spider\Spider;

class Spy
{
    private $url = 'http://www.ruanyifeng.com/home.html';
    private $maxDepth = 1;
    private $maxQueueSize = 5;

    /**
     * query dom
     */
    public function run()
    {
        $spider = new Spider($this->url);

// Add a URI discoverer. Without it, the spider does nothing. In this case, we want <a> tags from a certain <div>
// $spider->getDiscovererSet()->set(new XPathExpressionDiscoverer("//div[@id='recommend']//a"));
        $spider->getDiscovererSet()->set(new XPathExpressionDiscoverer("//a"));

// Set some sane options for this example. In this case, we only get the first 10 items from the start page.
        $spider->getDiscovererSet()->maxDepth = $this->maxDepth;
        $spider->getQueueManager()->maxQueueSize = $this->maxQueueSize;

// Let's add something to enable us to stop the script
        $spider->getDispatcher()->addListener(
            SpiderEvents::SPIDER_CRAWL_USER_STOPPED,
            function (Event $event) {
                echo "\nCrawl aborted by user.\n";
                exit();
            }
        );

// Add a listener to collect stats to the Spider and the QueueMananger.
// There are more components that dispatch events you can use.
        $statsHandler = new StatsHandler();
        $spider->getQueueManager()->getDispatcher()->addSubscriber($statsHandler);
        $spider->getDispatcher()->addSubscriber($statsHandler);

        $spider->crawl();
    }

    /**
     * Build a report
     *
     */
    public function report()
    {
        echo "\n  ENQUEUED:  " . count($this->statsHandler->getQueued());
        echo "\n  SKIPPED:   " . count($this->statsHandler->getFiltered());
        echo "\n  FAILED:    " . count($this->statsHandler->getFailed());
        echo "\n  PERSISTED:    " . count($this->statsHandler->getPersisted());

        // Finally we could do some processing on the downloaded resources
        // In this example, we will echo the title of all resources
        echo "\n\nDOWNLOADED RESOURCES: ";
        foreach ($this->getDownloader()->getPersistenceHandler() as $resource) {
            echo "\n - " . $resource->getCrawler()->filterXpath('//title')->text();
        }
    }
}